home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_09_07
/
9n07031a
< prev
next >
Wrap
Text File
|
1991-05-08
|
6KB
|
169 lines
/******************************************
* PHRASE.H v1.0
* phrase package header
* Richard Rathe 8/90
*/
#ifndef PHRASE_H
#define PHRASE_H
#define EOS '\0' /* end of string character */
#define MAXCHAR 64 /* length of largest string */
#define MINCHAR 2 /* length of smallest string */
#define MAXWORD 3 /* length of largest phrase */
#define LISTMARK "\r" /* delimiter for phrase list */
extern void phrase(char *in,char *out,char *stop);
extern char *getword(char *str,char *word,char *delim);
extern void addword(char *str,char *word,char *stop,char delim);
extern int skipword(char *str,char *stop);
extern char *getstopword(char *str,char *stopword);
extern void strlwr(char *str);
#endif
/************************************************
* phrase.c v1.0
* chunk words into phrases
* THINK C v4.0
* Richard Rathe 8/90
*/
#include <string.h> /* standard headers */
#include <ctype.h>
#include "phrase.h" /* for #defines and prototypes */
void phrase(char *in,char *out,char *stop)
{
char flag;
char buf[MAXCHAR];
*out = EOS; /* just to be sure */
while(*(in = getword(in,buf,&flag)) != EOS) /* get a word */
addword(out,buf,stop,flag); /* add it */
addword(out,buf,stop,flag); /* last word */
}
char *getword(char *str,char *word,char *delim)
{
while(isalnum(*str) || *str == '-' && *str != EOS)
{
*word = *str; /* load chars into word */
word++; /* advance pointers */
str++;
}
*delim = *str; /* save first delimiter */
while(!isalnum(*str) && *str != EOS) /* eat extra chars */
{
if(!isspace(*str)) /* if not white space */
*delim = *str; /* remember delimiter */
str++;
}
*word = EOS; /* add EOS to word */
return str; /* return current position */
}
void addword(char *str,char *word,char *stop,char delim)
{
int i,j;
static char word_array[MAXWORD][MAXCHAR];
for(i = 0;i < MAXWORD - 1;i++) /* age array */
strcpy(word_array[i],word_array[i + 1]);
strlwr(word); /* strip caps */
strcpy(word_array[MAXWORD - 1],word); /* add word */
for(i = 0;i < MAXWORD;i++) /* for each array position */
{
if(!word_array[i][0]) /* empty position */
continue; /* continue */
if(skipword(word_array[i],stop)) /* stopword first */
continue; /* continue */
if(skipword(word_array[MAXWORD - 1],stop)) /* stopword last */
continue; /* continue */
strcat(str,word_array[i]); /* add array position */
for(j = i + 1;j < MAXWORD;j++) /* add subsequent positions */
{
strcat(str," ");
strcat(str,word_array[j]);
}
strcat(str,LISTMARK); /* add list delimiter */
}
if(!isspace(delim)) /* if delimiter not space */
{
for(i = 0;i < MAXWORD;i++) /* clear array */
{
word_array[i][0] = EOS;
}
}
}
int skipword(char *word,char *stoplist)
{
int i,j,x;
char stopword[MAXCHAR];
if(strlen(word) < MINCHAR) /* if short word */
return 1; /* skip (true) */
if(isdigit(*word)) /* if leading digit */
return 1; /* skip (true) */
/* get a stopword */
while(*(stoplist = getstopword(stoplist,stopword)) != EOS)
{
if((x = strcmp(word,stopword)) == 0) /* word in stoplist */
return 1; /* skip (true) */
if(x < 0) /* if str > list */
break; /* we're done */
}
/* last stop word */
if(*stoplist == EOS && strcmp(word,stopword) == 0)
return 1; /* skip (true) */
return 0; /* otherwise add (false) */
}
char *getstopword(char *str,char *stopword)
{
/* step over commas and spaces */
while(isspace(*str) || *str == ',' && *str != EOS)
str++;
while(*str != ',' && *str != EOS)
{
*stopword = *str; /* load chars into stopword */
stopword++; /* advance pointers */
str++;
}
*stopword = EOS; /* add EOS to word */
return str; /* return current position */
}
void strlwr(char *str)
{
for(;*str != EOS;str++) /* convert string to lower case */
*str = tolower(*str);
}